package cup;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java_cup.runtime.DefaultSymbolFactory;
import java_cup.runtime.Symbol;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

import mv.GeneradorFichero;
import mv.Interprete;
import ts.TablaSimbolos;
import es.ucm.fdi.plg.evlib.Atributo;
import es.ucm.fdi.plg.evlib.TAtributos;

public class Main extends JFrame {

	/**
	 * 
	 */
	
	private static final long serialVersionUID = 1;
	private JPanel contentPane;
//	private JTextField textField;
	private JTextArea textArea;
//	private JTextField textField_1;
//	private JLabel lblIntroduzcaLaRuta_1;
	private Interprete interprete;
	private GeneradorFichero generadorFichero;
	private File archivo;
	private JLabel lblIntroduzcaLaRuta;
	private JButton btnAnalizador;
	private JButton btnTraza;



	public void accionEjecutarEnModoTraza(int modoTraza)
	{
		textArea.setText("");
		contentPane.validate();
		Atributo.fijaDebug(true);
	try {
		
		Parser p = new Parser(new Scanner(new FileInputStream(archivo)),new DefaultSymbolFactory());

		Symbol s = p.parse();

			
			ArrayList<Boolean> err = (ArrayList<Boolean>) ((TAtributos) s.value).a("err").valor();
			TablaSimbolos ts = (TablaSimbolos) ((TAtributos) s.value).a("ts").valor();
			ArrayList<String> codigo = (ArrayList<String>) ((TAtributos) s.value).a("cod").valor();

			if (err.contains("true"))
			{
				try {
				    // a jframe here isn't strictly necessary, but it makes the example a little more real
				    JFrame frame = new JFrame("Error de Compilación");

				    // prompt the user to enter their name
				    JOptionPane.showMessageDialog(frame, "Error en compilación");
				    //analizadorSintactico.printParser();
				    textArea.setText("Error:"+ err);
				
				} catch (Exception e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
				
			}
			else
			{
				
				generadorFichero=new GeneradorFichero(); 
				
				generadorFichero.generaFichero1("binario.txt", codigo);//te crea el fichero binario en el directorio del proyecto
				
				//JFrame frame = new JFrame("Analisis");

			    // prompt the user to enter their name
			    //JOptionPane.showMessageDialog(frame, "Archivo codificado");
			    
		
			    
			    
			    
			    Interprete inter= new Interprete();
			    try {
			    inter.generar1("binario.txt", modoTraza, textArea);
			    
			    JFrame frame1 = new JFrame("Ejecución");

			    // prompt the user to enter their name
			    JOptionPane.showMessageDialog(frame1, "Ejecución Finalizada");
			    textArea.append("Lenguaje codigo Pila:\n");
			    textArea.append(codigo.toString());
			    textArea.append("\n\n");
			    textArea.append("Informacion de los Tipos de Datos y Variables:\n");
			    textArea.append(ts.muestraDatosTipo1());
			    textArea.append("\n");
			    textArea.append(inter.imprimirMemoria1());
			    textArea.setText(textArea.getText());
			    }
			    catch (Exception e1) {
			    	// TODO Auto-generated catch block
					//e1.printStackTrace();
					try {
					    // a jframe here isn't strictly necessary, but it makes the example a little more real
					    JFrame frame1 = new JFrame("Error de ejecución");

					    // prompt the user to enter their name
					    JOptionPane.showMessageDialog(frame1, "Error en tiempo de ejecución");
					    //textArea.append("\n" + inter.imprimirMemoria());
					    textArea.append("Lenguaje codigo Pila:\n");
					    textArea.append(codigo.toString());
					    textArea.append("\n\n");
					    textArea.append("Informacion de los Tipos de Datos y Variables:\n");
					    textArea.append(ts.muestraDatosTipo1());
					    textArea.append("\n");
					    textArea.append(inter.imprimirMemoria1());
					    textArea.setText(textArea.getText());
					} catch (Exception e2) {
						// TODO Auto-generated catch block
						e2.printStackTrace();
					}
				}
			   
				
				/*
				Interprete inter= new Interprete();
				try {
					inter.generar("binario.txt", modoTraza, analizadorSintactico.datosParaInterprete(), textArea);
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					//e1.printStackTrace();
					try {
					    // a jframe here isn't strictly necessary, but it makes the example a little more real
					    JFrame frame = new JFrame("Error de ejecuci�n");

					    // prompt the user to enter their name
					    JOptionPane.showMessageDialog(frame, "Error en tiempo de ejecuci�n");
					    //textArea.append("\n" + inter.imprimirMemoria());
					
					} catch (Exception e2) {
						// TODO Auto-generated catch block
						e2.printStackTrace();
					}
				}
				*/
				//analizadorSintactico.printParser();
				
				//textArea.setText(analizadorSintactico.getSalida()+inter.imprimirMemoria() + textArea.getText());
			}
	  } catch (Exception e) {
		  JFrame frame = new JFrame("Aviso");

		    // prompt the user to enter their name
		    JOptionPane.showMessageDialog(frame, "Error en tiempo de compilaci�n");
      }
	
		//textArea.setText(analizadorSintactico.getSalida()+inter.imprimirMemoria());
	}
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Main() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 593, 535);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		
		JButton btnCargar = new JButton("Cargar archivo");
		btnCargar.setBounds(375, 46, 175, 43);
		btnCargar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//String rutaArchivo = textField.getText();
				JFileChooser chooser = new JFileChooser("ejemplos");
				chooser.setApproveButtonText("Abrir TxT");
				chooser.addChoosableFileFilter(new TxTFilter());
				if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
					archivo=chooser.getSelectedFile();
					contentPane.validate();
					if (archivo!=null){
						lblIntroduzcaLaRuta.setText("Archivo cargado");
						contentPane.add(btnAnalizador);
						contentPane.add(btnTraza);
						//btnAnalizador.setVisible(true);
						contentPane.validate();
						contentPane.updateUI();

					}
					
					}
				
			}
		});
		contentPane.setLayout(null);
		contentPane.add(btnCargar);
		
		btnAnalizador = new JButton("Analizar");
		btnAnalizador.setBounds(375, 90, 175, 43);
		btnAnalizador.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				accionEjecutarEnModoTraza(0);
			}
		});
		contentPane.setLayout(null);
		
		btnTraza = new JButton("Paso a paso");
		btnTraza.setBounds(375, 135, 175, 43);
		btnTraza.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					//Aqu� lo que haga el boton traza
				accionEjecutarEnModoTraza(1);
				}
		});
		contentPane.setLayout(null);
		
		//contentPane.add(btnAnalizador);
		
/*		JButton btnEjecutar = new JButton("Ejecutar");//No se puede ejecutar solo con el binario porque los datos de la memoria no estan ahi, por lo que hay que analizar y ejutar al mismo tiempo. Este boton no creo que sirva
		btnEjecutar.setBounds(375, 109, 175, 43);
		btnEjecutar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				interprete = new Interprete();
				interprete.generar(textField_1.getText(), 0,analizadorSintactico.datosParaInterprete());//no funciona porque analizadorSintactico es null y es necesario tener datos de la memoria
				textArea.append(interprete.muestraMemoria());
				textArea.append(interprete.muestraPila());
			}
		});
		contentPane.add(btnEjecutar);*/
		
/*		textField = new JTextField();
		textField.setBounds(21, 52, 317, 28);
		contentPane.add(textField);
		textField.setColumns(10);*/
		
		lblIntroduzcaLaRuta = new JLabel("Carga un programa:");
		lblIntroduzcaLaRuta.setBounds(21, 24, 246, 16);
		contentPane.add(lblIntroduzcaLaRuta);
		
/*		textField_1 = new JTextField();
		textField_1.setBounds(21, 127, 317, 28);
		textField_1.setColumns(10);
		contentPane.add(textField_1);*/
		
/*		lblIntroduzcaLaRuta_1 = new JLabel("Ruta del archivo del c\u00F3digo compilado:");
		lblIntroduzcaLaRuta_1.setBounds(21, 99, 281, 16);
		contentPane.add(lblIntroduzcaLaRuta_1);*/
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(21, 185, 529, 304);
		contentPane.add(scrollPane);
		
		textArea = new JTextArea();
		scrollPane.setViewportView(textArea);
		textArea.setEditable(false);
	}
	
}
